%% FDMA主函数 - 频分多址仿真
% 本程序模拟了频分多址接入技术，这是第一代移动通信(1G)使用的多址接入技术
% 在FDMA中，可用频谱被分为多个非重叠的频带，每个用户分配一个专用频带

clear all;
close all;
clc;

%% 参数设置
num_users = 4;          % 用户数量
num_symbols = 1000;     % 每个用户的符号数
snr_dB = 10;            % 信噪比（dB）
M = 4;                  % 调制阶数（QPSK）
fs = 1000000;           % 采样频率（Hz）
total_bandwidth = 25000;% 总带宽（Hz）
guard_band = 2000;      % 保护带宽（Hz）

% 计算每个用户的带宽
user_bandwidth = (total_bandwidth - (num_users-1)*guard_band) / num_users;

% 每个用户的载波频率
carrier_frequencies = zeros(1, num_users);
for i = 1:num_users
    carrier_frequencies(i) = (i-1) * (user_bandwidth + guard_band);
end

%% 生成用户数据
user_data = cell(1, num_users);
user_signals = cell(1, num_users);
modulated_signals = cell(1, num_users);

fprintf('正在生成%d个用户的数据...\n', num_users);

for user = 1:num_users
    % 为每个用户生成随机比特
    user_data{user} = randi([0 1], 1, num_symbols * log2(M));
    
    % 调制用户数据
    modulated_signals{user} = modulate_data(user_data{user}, M);
    
    % 上变频到指定频带
    user_signals{user} = upconvert_signal(modulated_signals{user}, carrier_frequencies(user), fs);
    
    fprintf('用户 %d 数据已生成并调制\n', user);
end

%% 频分多址复用 - 组合所有用户信号
combined_signal = combine_fdma_signals(user_signals);

%% 通过AWGN信道
noisy_signal = add_awgn_noise(combined_signal, snr_dB);

%% 接收端处理
received_data = cell(1, num_users);

fprintf('正在接收和解调...\n');

for user = 1:num_users
    % 下变频到基带
    received_baseband = downconvert_signal(noisy_signal, carrier_frequencies(user), fs, user_bandwidth);
    
    % 解调信号
    received_data{user} = demodulate_data(received_baseband, M);
    
    % 计算误码率
    bit_errors = sum(received_data{user} ~= user_data{user});
    ber = bit_errors / length(user_data{user});
    
    fprintf('用户 %d 的误码率: %f\n', user, ber);
end

%% 绘制频谱图
plot_fdma_spectrum(user_signals, noisy_signal, fs, carrier_frequencies, user_bandwidth);

fprintf('FDMA仿真完成!\n'); 